package br.com.foxinline.manager.criar;

import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerCriarCadastroDomiciliar implements Serializable {

    @EJB
    CadastroDomiciliarServico cadastroDomiciliarServico;
    @EJB
    CadastroIndividualServico cadastroIndividualServico;
    @EJB
    CadastroDomiciliarFamiliasServico cadastroDomiciliarFamiliasServico;
    @EJB
    CidadaoServico cidadaoServico;
    @EJB
    ProfissionalServico profissionalServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    UsuarioServico usuarioServico;
    private CadastroDomiciliar cadastro;
    private Cidadao responsavel;
    private List<Cidadao> responsaveis;
    private Profissional profissionalCadastrar;
    private Profissional profissionalPesquisar;
    private List<Profissional> profissionaisPesquisar;
    private CadastroDomiciliarFamilias familia;
    private boolean mensagemEndereco;

    @PostConstruct
    public void init() {

        cadastro = new CadastroDomiciliar();
        cadastro.setEndereco(new Endereco());
        cadastro.setCadastroDomiciliarFamilias(new ArrayList<CadastroDomiciliarFamilias>());
        cadastro.setAnimalDomicilio(new ArrayList<AnimalDomicilio>());
        iniciarProfissional();

        responsavel = new Cidadao();

        profissionalCadastrar = new Profissional();
        profissionalCadastrar.setEndereco(new Endereco());
        profissionalPesquisar = new Profissional();
        profissionaisPesquisar = new ArrayList<Profissional>();

        mensagemEndereco = false;
        iniciarFamilia();
    }

    public List<Cidadao> getResponsaveis() {
        return responsaveis;
    }

    public void setResponsaveis(List<Cidadao> responsaveis) {
        this.responsaveis = responsaveis;
    }

    public Profissional getProfissionalCadastrar() {
        return profissionalCadastrar;
    }

    public void setProfissionalCadastrar(Profissional profissionalCadastrar) {
        this.profissionalCadastrar = profissionalCadastrar;
    }

    public Profissional getProfissionalPesquisar() {
        return profissionalPesquisar;
    }

    public void setProfissionalPesquisar(Profissional profissionalPesquisar) {
        this.profissionalPesquisar = profissionalPesquisar;
    }

    public List<Profissional> getProfissionaisPesquisar() {
        return profissionaisPesquisar;
    }

    public void setProfissionaisPesquisar(List<Profissional> profissionaisPesquisar) {
        this.profissionaisPesquisar = profissionaisPesquisar;
    }

    public CadastroDomiciliar getCadastro() {
        return cadastro;
    }

    public void setCadastro(CadastroDomiciliar cadastro) {
        this.cadastro = cadastro;
    }

    public Cidadao getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(Cidadao responsavel) {
        this.responsavel = responsavel;
    }

    public boolean isMensagemEndereco() {
        return mensagemEndereco;
    }

    public void setMensagemEndereco(boolean mensagemEndereco) {
        this.mensagemEndereco = mensagemEndereco;
    }

    public CadastroDomiciliarFamilias getFamilia() {
        return familia;
    }

    public void setFamilia(CadastroDomiciliarFamilias familia) {
        this.familia = familia;
    }

    /**
     *
     */
    public void salvar() {
        try {
            if (verificarCadastro()) {
                cadastro.setDigitadoPor(usuarioServico.getCurrentUser());
                cadastro.setDataDigitado(new Date());

                enderecoServico.salvar(cadastro.getEndereco());

                cadastroDomiciliarFamiliasServico.salvarTodos(cadastro.getCadastroDomiciliarFamilias());

                cadastroDomiciliarServico.salvar(cadastro);

                Msg.messagemInfo(Msg.SuccessFull);
                init();
            } 
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void adicionarFamilia() {
        cadastro.getCadastroDomiciliarFamilias().add(familia);
        iniciarFamilia();
    }

    public void editarFamilia(CadastroDomiciliarFamilias familia) {
        this.familia = familia;
        cadastro.getCadastroDomiciliarFamilias().remove(familia);
    }

    public void removerFamilia(CadastroDomiciliarFamilias familia) {
        cadastro.getCadastroDomiciliarFamilias().remove(familia);
    }

    public void pesquisarResponsavel() {
        responsaveis = cidadaoServico.pesquisarTodos(responsavel);
    }

    public void removerResponsavel() {
        familia.setResponsavel(new Cidadao());
    }

    public void selecionarResponsavel(Cidadao responsavel) {
        familia.setResponsavel(responsavel);

        Integer membros = cadastroIndividualServico.pesquisarDependentes(responsavel).size();

        familia.setNumeroMembrosFamilia(membros + 1);

        limparDialogResponsavel();
    }

    public void pesquisarProfissional() {
        profissionaisPesquisar = profissionalServico.findProfissional(profissionalPesquisar);
    }

    public void removerProfissional() {
        iniciarProfissional();
    }

    public void selecionarProfissional(Profissional profissional) {
        cadastro.setProfissional(profissional);
        limparDialogProfissional();
    }

    public void salvarProfissional() {
        try {
            profissionalServico.salvar(profissionalCadastrar);
            Msg.messagemInfo(Msg.SuccessFull);
            cadastro.setProfissional(profissionalCadastrar);

            RequestContext.getCurrentInstance().execute("dialogProfissional.hide()");
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeEndereco() {

        Endereco endereco = enderecoServico.existCep(profissionalCadastrar.getEndereco());

        if (endereco != null) {
            profissionalCadastrar.setEndereco(endereco);
            mensagemEndereco = false;
        } else {
            String cep = profissionalCadastrar.getEndereco().getCep();
            profissionalCadastrar.setEndereco(new Endereco());
            profissionalCadastrar.getEndereco().setCep(cep);

            mensagemEndereco = true;
        }
    }

    public void existeEnderecoCadastro() {

        Endereco endereco = enderecoServico.existCep(cadastro.getEndereco());

        if (endereco != null) {
            cadastro.setEndereco(endereco);
        } else {
            String cep = cadastro.getEndereco().getCep();
            cadastro.setEndereco(new Endereco());
            cadastro.getEndereco().setCep(cep);
        }
    }

    private boolean verificarCadastro() {
        if (cadastro.getProfissional().getId() == null) {
            Msg.messagemError("Profissional é obrigatório");
            RequestContext.getCurrentInstance().execute("requiredProfissional(true)");
            return false;
        }

        if ((cadastro.getEndereco().getLogradouro() == null || cadastro.getEndereco().getLogradouro().isEmpty())
                || (cadastro.getEndereco().getBairro() == null)) {

            if (cadastro.getEndereco().getLogradouro() == null || cadastro.getEndereco().getLogradouro().isEmpty()) {
                Msg.messagemError("Logradouro é obrigatório");
            }
            if (cadastro.getEndereco().getBairro() == null) {
                Msg.messagemError("Bairro é obrigatório");
            }

            RequestContext.getCurrentInstance().execute("requiredLogradouro(true)");
            return false;
        }

        return true;
    }

    public void limparDialogResponsavel() {
        responsavel = new Cidadao();
        responsaveis = new ArrayList<Cidadao>();
    }

    public void limparDialogProfissional() {
        profissionalPesquisar = new Profissional();
        profissionalCadastrar = new Profissional();
        profissionaisPesquisar = new ArrayList<Profissional>();
    }

    private void iniciarProfissional() {
        cadastro.setProfissional(new Profissional());
        cadastro.getProfissional().setMicroArea(new MicroArea());
    }

    private void iniciarFamilia() {
        familia = new CadastroDomiciliarFamilias();
        familia.setResponsavel(new Cidadao());
    }
}
